디자인 패턴이란?
자주 발생하는 문제들을 피하기 위해 사용되는 패턴.
- 소프트웨어 설계시 자주 발생하는 고질적인 문제들이 또 발생했을 때 재사용할 수 있는 해결책
- 패턴은 팀원 간 의사 소통을 원활하게 해주는 중요한 역할을 합니다.
아래의 디자인 패턴에 대한 설명은 GoF 디자인 패턴입니다.
디자인 패턴 분류
- 생성 패턴 - 객체 생성
- 구조 패턴 - 객체 결합
- 행위 패턴 - 객체 간 커뮤니케이션
생성 패턴
인스턴스를 만드는 절차를 추상화하는 패턴입니다.
- 객체의 생성과 조합을 캡슐화 -> 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공합니다.
구조 패턴
클래스나 객체를 조합해 더 큰 구조를 만드는 패턴입니다.
- 다른 인터페이스를 가진 2개의 객체를 묶어 단일 인터페이스를 제공하거나, 객체들을 서로 묶어 새로운 기능을 제공합니다.
행위 패턴
객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴입니다.
- 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그 과정에서 객체 사이의 결합도를 최소화 하는 것에 중점을 둡니다.
분류 별 종류
생성(Creational) 패턴
구조(Structural) 패턴
- 어댑터(Adapter)
- 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환시키는 패턴
- 브리지(Bridge)
- 구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능하고 확장이 가능하도록 하는 패턴
- 즉 기능과 구현에 대해 두 개를 별도의 클래스로 구현
- 컴퍼지트(Composite)
- 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴
- 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.
- 데커레이터(Decorator)
- 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴
- 기능 확장이 필요할 때 서브클래싱 대신 쓸 수 있는 유연한 대안
- 퍼사드(Facade)
- 한 서브시스템 내의 인터페이스 집합에 대한 획일화 된 하나의 인터페이스를 제공하는 패턴
- 플라이웨이트(Flyweight)
- 동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 서로 공유하여 사용하도록 하여 메모리 사용량을 최소화 하는 패턴
- 프록시(Proxy)
- 실제 기능을 수행하는 객체 대신 가상의 객체를 사용해 로직의 흐름을 제어하는 디자인 패턴
- 프록시 클래스는 Wrapper로서의 역할 수행
행위(Behavioral) 패턴
- 책임 연쇄(Chain of Resposibility)
- 클라이언트로부터의 요청을 처리할 수 있는 처리 객체를 집합으로 만들어 부여함으로써 결합도를 없애기 위한 패턴
- 커맨드(Command)
- 요청을 객체의 형태로 캡슐화하여 사용자가 보낸 요청을 나중에 이용할 수 있도록 메서드 이름, 매개변수 등 요청에 필요한 정보를 저장 또는 로깅, 취소할 수 있게하는 패턴
- 인터프리터(Interpreter)
- 문법 규칙을 클래스화 한 구조로, 일련의 규칙으로 정의된 문법적 언어를 해석하는 패턴
- SQL 구문 분석, 기호 처리 엔진 등에서 사용
- 이터레이터(Iterator)
- 내부 표현부를 노출하지 않고, 집합 객체에 속한 원소들을 순차적으로 접근할 수 있는 방법을 제공하는 패턴
- 중재자(Mediator)
- 모든 클래스 간의 복잡한 로직(상호작용)을 캡슐화하여 하나의 클래스에 위임하여 처리하는 패턴
- M:N 관계에서 M:1 관계로 복잡도를 떨어뜨려 유지 보수 및 재사용의 확장성에 유리
- 메멘토(Memento)
- 객체의 상태 정보를 저장하고 사용자의 필요에 의하여 원하는 시점의 데이터를 복원할 수 있는 패턴
- 옵저버(Observer)
- 객체의 상태가 변할 때 그와 연관된 객체들에게 알림을 보내는 패턴
- 한 객체의 상태 변화에 따라 다른 객체의 상태도 연동되도록 1:N 객체 의존 관계를 구성하는 패턴
- 상태(State)
- 객체의 특정 상태를 클래스로 선언하고, 클래스에서는 해당 상태에서 할 수 있는 행위들을 메서드로 정의하는 패턴
- 객체 내부의 상태에 따라 동작을 변경해야할 때 사용
- 전략(Strategy)
- 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하는 패턴
- 동적으로 행위의 수정이 필요한 경우 전략을 바꾸는 것만으로 행위의 수정이 가능
- 템플릿 메서드(Template Method)
- 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴
- 방문자(Visitor)
- 실제 로직을 가지고 있는 객체(Visitor)가 로직을 적용할 객체를 방문하면서 실행하는 패턴
- 로직과 구조를 분리하는 패턴, 구조를 수정하지 않고도 새로운 동작을 기존 객체에 추가 가능
끝
각각의 패턴에 대해 상세하게 공부해 이 글에 각각의 링크를 추가하겠습니다.
감사합니다.
Text by Chaelin. Photographs by Chaelin, Unsplash.